Saltar al contenido principal

Plan de pruebas

Pruebas de backend

Pruebas de Integración

En este tipo de pruebas se comprueban procesos completos para verificar la existencia de errores.

El sistema de testing empleado en el código se basa en pruebas automatizadas utilizando pytest y pytest_asyncio para garantizar la calidad y el correcto funcionamiento del software.

Se han realizado pruebas de integración para cada uno de los diferentes endpoints de la API desarrollada con FastApi utilizando MongoDb como sistema de base de datos. Estas pruebas han sido diseñadas para realizarse simultáneamente con las diferentes features a implementar, lo que asegura el correcto funcionamiento de los endpoints previamente al mergeo de los mismos.

Se han establecido estándares para la realización de todos los test de la aplicación, generando test con nombres fáciles de entender para facilitar el entendimiento de los mismos.

Ejemplo de inserción de objetos en la base de datos y testeo de endpoints:

# Fixture para insertar intervenciones en la base de datos
@pytest_asyncio.fixture
async def insert_interventions_mongo(mongo_db: Database):
# Código para insertar intervenciones en la base de datos
yield result

Ejemplo de testeo de endpoints:

# Test para obtener detalles de una intervención
def test_get_intervention_detail(
app_client: TestClient,
insert_interventions_mongo):
# Código de prueba para obtener detalles de una intervención
assert ... # Assertions

Pruebas de Carga

Las pruebas de carga simulan el comportamiento de varios usuarios que acceden al sistema simultáneamente, reproduciendo el rendimiento, la estabilidad y la funcionalidad del sistema web en condiciones reales.

Ejemplo de configuración de prueba de carga con Locust:

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
wait_time = between(5, 15)

@task
def index(self):
self.client.get("/")

El código proporcionado es un ejemplo de cómo configurar una prueba de carga utilizando Locust, una herramienta de pruebas de rendimiento de código abierto. Define una clase WebsiteUser que hereda de HttpUser de Locust. La variable wait_time se configura para simular un tiempo de espera aleatorio entre 5 y 15 segundos entre las tareas. La tarea index simula una solicitud GET a la página de inicio ("/"). Este tipo de pruebas son útiles para evaluar cómo un sistema maneja múltiples solicitudes simultáneas.

Estos son algunos ejemplos de test de cargas realizados sobre los endpoints mas "exigentes" del sistema siendo los que mas recursos consumen:

Request stats Resquest per second

Esto indica que nuestra aplicación va a ser perfectamente capaz de mantener una usabilidad excelente para un número menor a 10 usuarios concurrentes.

Pruebas de frontend

El plan de pruebas para el desarrollo frontend se basa en Jest, una biblioteca de pruebas de JavaScript.

Se utilizan Jest y @testing-library/react para escribir y ejecutar pruebas de manera eficiente. Se emplea "mocking" para simular funciones externas, como las llamadas a API, lo que facilita el enfoque en la lógica interna del componente que se está probando.

Las pruebas unitarias ayudan a encontrar y solucionar errores de forma temprana, resultando en un código más sólido y mantenible.

Ejemplo de prueba unitaria con Jest:

import { render, waitFor, screen } from '@testing-library/react'
import { test, expect, describe, jest } from '@jest/globals'
import InterventionPage from '../../app/interventions/page'
import { fetchDataInterventions } from '../../app/interventions/fetchIntervention.js'

jest.mock('../../app/interventions/fetchIntervention.js')
jest.mock('next/navigation', () => ({
useRouter: () => ({
push: jest.fn()
}),
useSearchParams: () => ({
get: jest.fn()
}),
usePathname: () => ({
get: jest.fn()
})
}))

describe('InterventionList', () => {
test('Renderizar', async () => {
const datos = [
{
id: 1,
intervention_date: '2018-05-08T16:29:31.591Z',
patient: 'John Doe'
},
{
id: 2,
intervention_date: '2018-05-08T16:29:31.591Z',
patient: 'Jane Doe'
}
]

fetchDataInterventions.mockResolvedValue(datos)

const data = await fetchDataInterventions()

expect(data).toEqual(datos)

waitFor(async () => {
render(<InterventionPage />)
expect(screen.getByText('John Doe')).toBeInTheDocument()
expect(screen.getByText('Jane Doe')).toBeInTheDocument()
})
})
})